package org.oproject.rmi.hessian.client;

import java.net.MalformedURLException;

import org.oproject.rmi.hessian.core.invoke.Invokor;
import org.oproject.rmi.hessian.core.job.HessianJob;
import org.oproject.rmi.hessian.exception.HessianRemoteInvokeException;

import com.caucho.hessian.client.HessianProxyFactory;

/**
 * 客服端远程服务调用对象
 * @author SQ
 *
 */
public class RemoteService 
{
	private static HessianProxyFactory factory;
		
	/**
	 * 使用默认的代理工厂方法
	 */
	public RemoteService()
	{
		factory = new HessianProxyFactory();
	}
	
	/**
	 * 使用自定义的代理工厂方法
	 * @param hessianProxyFactory
	 */
	public RemoteService(HessianProxyFactory hessianProxyFactory)
	{
		factory = hessianProxyFactory;
	}
	
	/**
	 * 调用远程服务，如果hessian支持自动刷新，则每次执行之后，不管是否成功，都将为hessianjob生成一个新的ID，保证每次远程待用都将生成新的job id<br>
	 * 如果hessian job不支持自动刷新，则建议每次调用结束后，调用HessianJob.fresh()方法，刷新job id，保证下次调用的时候拥有不同的job id
	 * @param url
	 * @param hessianJob
	 * @return
	 * @throws MalformedURLException
	 * @throws HessianRemoteInvokeException 
	 */
	public Object invoke(String url, HessianJob hessianJob) throws MalformedURLException, HessianRemoteInvokeException
	{
		Invokor invokeService = (Invokor) factory.create(Invokor.class, url);
	    try
	    {
	    	return invokeService.invoke(hessianJob);
	    }
	    finally
	    {
	    	if(hessianJob.isAutoFreshAble())
	    	{
	    		//每次调用之后，刷新job，保证下次使用的时候，会有不同的job id
		    	hessianJob.fresh();
	    	}
	    }
	}
}
